package cn.stylefeng.guns.sys.modular.user.utils;

import cn.stylefeng.guns.sys.modular.user.constant.ApiPayConstant;
import cn.stylefeng.guns.sys.modular.user.utils.param.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.huifu.bspay.sdk.opps.client.BasePayClient;
import com.huifu.bspay.sdk.opps.core.BasePay;
import com.huifu.bspay.sdk.opps.core.config.MerConfig;
import com.huifu.bspay.sdk.opps.core.request.V2TradeAcctpaymentPayRequest;
import com.huifu.bspay.sdk.opps.core.request.V2TradePaymentJspayRequest;
import com.huifu.bspay.sdk.opps.core.request.V2UserBasicdataEntRequest;
import com.huifu.bspay.sdk.opps.core.request.V2UserBusiOpenRequest;
import org.springframework.util.StringUtils;

import java.util.*;


/**
 * 汇付API
 * 获取请求流水号：SequenceTools.getReqSeqId32()
 * 获取当前请求日期：DateTools.getCurrentDateYYYYMMDD()
 */

/**
 * 实现汇付第三方接口调用
 */
public class ApiPayUtil {



    /**
     * 支付
     */
    public static Map<String, Object> pay(PayParam payParam) throws Exception {
        //1.初始化设置商户公共参数
        BasePay.initWithMerConfig(getMerchantConfig());

        //2.组装请求参数
        V2TradePaymentJspayRequest request = new V2TradePaymentJspayRequest();
        //2.1 请求日期
        request.setReqDate(payParam.getReqDate());
        //2.2 请求流水号
        request.setReqSeqId(payParam.getReqSeqId());
        //2.3 商户号
        request.setHuifuId(payParam.getHuifuId());
        //2.4 交易类型
        request.setTradeType(payParam.getTradeType());
        //2.5 交易金额
        request.setTransAmt(payParam.getTransAmt());
        //2.6 商品描述
        request.setGoodsDesc(payParam.getGoodsDesc());

        //2.7 设置非必填字段
        request.setExtendInfo(getExtendInfo(payParam));

        //3.发起调用
        return BasePayClient.request(request);
    }

    /**
     * 非必填字段
     */
    private static Map<String, Object> getExtendInfo(PayParam payParam) {
        //设置非必填字段
        Map<String, Object> extendInfoMap = new HashMap<>();

        //回调地址
        extendInfoMap.put("notify_url", payParam.getNotifyUrl());

        //判断如果交易类型是T_MINIAPP微信小程序或T_JSAPI微信公众号需要添加如下参数值
        String tradeType = payParam.getTradeType();
        if ("T_MINIAPP".equals(tradeType) || "T_JSAPI".equals(tradeType)) {
            JSONObject wxDataJO = new JSONObject();
            //用户标识
            wxDataJO.put("openid", payParam.getOpenId());
            //wxDataJO.put("openid", "oRrdQt5MVV9Ab7r_gfA5pen4V0co");
//            wxDataJO.put("sub_appid", "wxebe752df4b4c8d95");

            String wxData = JSONObject.toJSONString(wxDataJO);
            extendInfoMap.put("wx_data", wxData);
        }


        return extendInfoMap;
    }


/*    public static void main(String[] args) throws Exception {
        BalancePaymentParam param = new BalancePaymentParam();
        param.setOrdAmt("0.10");
        param.setOutHuifuId(ApiPayConstant.SYS_ID);
        param.setReqDate(DateTools.getCurrentDateYYYYMMDD());
        param.setReqSeqId(SequenceTools.getReqSeqId32());
        List<AcctInfo> list = new ArrayList<>();
        AcctInfo acctInfo = new AcctInfo();
        acctInfo.setDivAmt("0.10");
        acctInfo.setHuifuId("6666000142415924");
        list.add(acctInfo);
        param.setAcctInfos(list);
        Map<String, Object> map = balancePay(param);
        System.out.println(map.get("ord_amt"));
        System.out.println(map);
    }*/

    /**
     * 余额支付
     */
    public static Map<String, Object> balancePay(BalancePaymentParam param) throws Exception {
        // 1. 初始化设置商户公共参数
        BasePay.initWithMerConfig(getMerchantConfig());

        // 2.组装请求参数
        V2TradeAcctpaymentPayRequest request = new V2TradeAcctpaymentPayRequest();
        // 请求流水号
        request.setReqSeqId(param.getReqSeqId());
        // 请求日期
        request.setReqDate(param.getReqDate());
        // 出款方商户号
        request.setOutHuifuId(param.getOutHuifuId());
        // 支付金额
        request.setOrdAmt(param.getOrdAmt());
        // 分账对象
        request.setAcctSplitBunch(getAcctSplitBunch(param));
        // 安全信息
        request.setRiskCheckData(getRiskCheckData());

        // 3. 发起API调用
        return BasePayClient.request(request);
    }

    /**
     * 构造安全信息对象
     */
    private static String getRiskCheckData() {
        //创建Json对象
        JSONObject jsonObject = new JSONObject();
        //转账原因
        //01：卡券推广类；02：卡券核销类；03：消费；04：工资代发；05：分润
        jsonObject.put("transfer_type", "05");
        //将json对象 -> json字符串 -> 返回
        return JSONObject.toJSONString(jsonObject);
    }

    /**
     * 构造分账对象
     */
    private static String getAcctSplitBunch(BalancePaymentParam param) {
        //获取分账对象
        List<AcctInfo> acctInfos = param.getAcctInfos();


        //创建数组
        JSONArray jsonArray = new JSONArray();
        //遍历集合
        acctInfos.forEach(s -> {
            //创建Json对象
            JSONObject jsonObject = new JSONObject();
            //分账金额
            jsonObject.put("div_amt", s.getDivAmt());
            //被分账方的汇付ID
            jsonObject.put("huifu_id", s.getHuifuId());
            //添加到数组中
            jsonArray.add(jsonObject);
        });

        //创建Json对象
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("acct_infos", jsonArray);

        //将json集合转换为字符串返回
        return JSONArray.toJSONString(jsonObject);
    }

    /**
     * 商户配置
     */
    private static MerConfig getMerchantConfig() {
        MerConfig merConfig = new MerConfig();
        merConfig.setProcutId(ApiPayConstant.PRODUCT_ID);
        merConfig.setSysId(ApiPayConstant.SYS_ID);
        merConfig.setRsaPrivateKey(ApiPayConstant.RSA_PRIVATE_KEY);
        merConfig.setRsaPublicKey(ApiPayConstant.RSA_PUBLIC_KEY);
        return merConfig;
    }

    /*public static void main(String[] args) throws Exception {
        *//*EnterpriseUserParam enterpriseUserParam = new EnterpriseUserParam();
        enterpriseUserParam.setContactMobile("13610385555");
        enterpriseUserParam.setContactName("戈同全");
        enterpriseUserParam.setLegalCertBeginDate("20200428");
        enterpriseUserParam.setLegalCertEndDate("20400428");
        enterpriseUserParam.setLegalCertNo("420703198501223416");
        enterpriseUserParam.setLegalName("李志刚");
        enterpriseUserParam.setLegalCertType("00");
        enterpriseUserParam.setLicenseCode("91420113MAC6JFUD6L");
        enterpriseUserParam.setReqDate("20231103");
        enterpriseUserParam.setReqSeqId(SequenceTools.getReqSeqId32());
        enterpriseUserParam.setRegName("武汉市铁运物流有限公司");
        enterpriseUserParam.setLicenseValidityType("1");
        enterpriseUserParam.setLicenseBeginDate("20230829");
        enterpriseUserParam.setRegProvId("420000");
        enterpriseUserParam.setRegAreaId("420100");
        enterpriseUserParam.setRegDistrictId("420113");
        enterpriseUserParam.setRegDetail("湖北省武汉市汉南区纱帽街幸福园中路186号");
        enterpriseUserParam.setLegalCertValidityType("0");
        Map<String, Object> enterpriseUser = createEnterpriseUser(enterpriseUserParam);
        System.out.println(enterpriseUser.get("resp_code"));
        System.out.println(enterpriseUser);*//*

        //6666000142415924
        SettleInParam param = new SettleInParam();
        param.setHuifuId("666600014241592");
        param.setReqDate(DateTools.getCurrentDateYYYYMMDD());
        param.setReqSeqId(SequenceTools.getReqSeqId32());
        param.setUpperHuifuId(ApiPayConstant.SYS_ID);
        param.setCardType(0);
        param.setCardName("武汉市铁运物流有限公司");
        param.setCardNo("");
        param.setProvId("");
        param.setAreaId("420100");
        param.setBankCode("01040000");
        param.setBranchName("");
        Map<String, Object> map = settleIn(param);
        System.out.println(map);
    }*/

    /**
     * 企业用户基本信息开户
     */
    public static Map<String, Object> createEnterpriseUser(EnterpriseUserParam param) throws Exception {
        //1.初始化设置商户公共参数
        BasePay.initWithMerConfig(getMerchantConfig());

        //2.组装请求参数
        V2UserBasicdataEntRequest request = new V2UserBasicdataEntRequest();
        // 请求流水号
        request.setReqSeqId(param.getReqSeqId());
        // 请求日期
        request.setReqDate(param.getReqDate());
        // 企业用户名称
        request.setRegName(param.getRegName());
        // 营业执照编号
        request.setLicenseCode(param.getLicenseCode());
        // 证照有效期类型
        request.setLicenseValidityType(param.getLicenseValidityType());
        // 证照有效期起始日期
        request.setLicenseBeginDate(param.getLicenseBeginDate());
        // 证照有效期结束日期
        request.setLicenseEndDate(param.getLicenseEndDate());
        // 注册地址(省)
        request.setRegProvId(param.getRegProvId());
        // 注册地址(市)
        request.setRegAreaId(param.getRegAreaId());
        // 注册地址(区)
        request.setRegDistrictId(param.getRegDistrictId());
        // 注册地址(详细信息)
        request.setRegDetail(param.getRegDetail());
        // 法人姓名
        request.setLegalName(param.getLegalName());
        // 法人证件类型
        request.setLegalCertType(param.getLegalCertType());
        // 法人证件号码
        request.setLegalCertNo(param.getLegalCertNo());
        // 法人证件有效期类型
        request.setLegalCertValidityType(param.getLegalCertValidityType());
        // 法人证件有效期开始日期
        request.setLegalCertBeginDate(param.getLegalCertBeginDate());
        // 法人证件有效期截止日期
        request.setLegalCertEndDate(param.getLegalCertEndDate());
        // 联系人姓名
        request.setContactName(param.getContactName());
        // 联系人手机号
        request.setContactMobile(param.getContactMobile());

        // 3. 发起API调用
        return BasePayClient.request(request);
    }

    /**
     * 业务入驻
     */
    public static Map<String, Object> settleIn(SettleInParam param) throws Exception {
        //1.初始化设置商户公共参数
        BasePay.initWithMerConfig(getMerchantConfig());

        //2.组装请求参数
        V2UserBusiOpenRequest request = new V2UserBusiOpenRequest();
        // 汇付ID
        request.setHuifuId(param.getHuifuId());
        // 请求流水号
        request.setReqSeqId(param.getReqSeqId());
        // 请求日期
        request.setReqDate(param.getReqDate());
        // 渠道商/商户汇付Id
        request.setUpperHuifuId(param.getUpperHuifuId());

        //3.设置非必要字段
        request.setExtendInfo(getExtendInfo(param));

        //4.调用接口
        return BasePayClient.request(request);
    }

    /**
     * 非必填字段
     */
    private static Map<String, Object> getExtendInfo(SettleInParam param) {
        //设置非必填字段
        Map<String, Object> extendInfoMap = new HashMap<>();

        //结算卡信息
        //卡类型
        extendInfoMap.put("card_type", param.getCardType());

        //卡户名
        extendInfoMap.put("card_name", param.getCardName());

        //卡号
        extendInfoMap.put("card_no", param.getCardNo());

        //银行所在省
        extendInfoMap.put("prov_id", param.getProvId());

        //银行所在市
        extendInfoMap.put("area_id", param.getAreaId());

        //银行号
        String bankCode = param.getBankCode();
        if (StringUtils.hasLength(bankCode)) {
            extendInfoMap.put("bank_code", bankCode);
        }

        //支行名称
        String branchName = param.getBranchName();
        if (StringUtils.hasLength(branchName)) {
            extendInfoMap.put("branch_name", branchName);
        }

        //持卡人证件类型
        String certType = param.getCertType();
        if (StringUtils.hasLength(certType)) {
            extendInfoMap.put("cert_type", certType);
        }

        //持卡人证件号码
        String certNo = param.getCertNo();
        if (StringUtils.hasLength(certNo)) {
            extendInfoMap.put("cert_no", certNo);
        }

        //持卡人证件有效期类型
        Integer certValidityType = param.getCertValidityType();
        if (Objects.nonNull(certValidityType)) {
            extendInfoMap.put("cert_validity_type", certValidityType.toString());
        }

        //持卡人证件有效期（起始）
        String certBeginDate = param.getCertBeginDate();
        if (StringUtils.hasLength(certBeginDate)) {
            extendInfoMap.put("cert_begin_date", certBeginDate);
        }

        //持卡人证件有效期（截止）
        String certEndDate = param.getCertEndDate();
        if (StringUtils.hasLength(certEndDate)) {
            extendInfoMap.put("cert_end_date", certEndDate);
        }

        return extendInfoMap;
    }
}
